// 封装购物车模块数据
import { computed, ref } from 'vue'
import { defineStore } from 'pinia'
import { useUserStore } from "./userStore";
import { insertCartAPI, findNewCartListAPI, delCartAPI } from "@/apis/cart";

export const useCartStore = defineStore('cart', () => {

  // 获取最新购物车列表action
  const updateNewList = async () => {
    const res = await findNewCartListAPI()
    cartList.value = res.result
  }


  // 接口购物车

  // 1.加入购物车
  const userStore = useUserStore()
  const isLogin = computed(() => userStore.userInfo.token)



  // 本地购物车

  const cartList = ref([])
  const addCart = async (goods) => {
    const { skuId, count } = goods
    if (isLogin) {
      // 登录之后的加入购物车逻辑
      await insertCartAPI({ skuId, count })
      updateNewList()
    } else {
      const item = cartList.value.find((item) => goods.skuId === item.skuId)
      if (item) {
        // 找到
        item.count++
      } else {
        // 没找到
        cartList.value.push(goods)
      }
    }
  }

  // 3.删除购物车
  const delCart = async (skuId) => {
    if (isLogin.value) {
      // 调用接口实现接口购物车中的删除功能
      await delCartAPI([skuId])
      updateNewList()
    } else {
      
      const idx = cartList.value.findIndex((item) => skuId === item.skuId)
      cartList.value.splice(idx, 1)
    }

  }


  // 清除购物车
  const clearCart = ()=>{
    cartList.value = []
  }



  // 头部购物车统计计算（商品数和价格计算）
  // 1)商品数 所有项的count之和
  const allCount = computed(() => cartList.value.reduce((a, c) => a + c.count, 0))
  // 2)价格计算 所有项的count*price之和
  const allPrice = computed(() => cartList.value.reduce((a, c) => a + c.count * c.price, 0))

  // 单选功能
  const singlecheck = (skuId, selected) => {
    // 通过skuId找到要修改的商品项，然后把它的selected与选中的selected同步
    const item = cartList.value.find((item) => item.skuId === skuId)
    item.selected = selected
  }

  // 全选功能：是否全选
  const isAll = computed(() => cartList.value.every(item => item.selected))
  const allCheck = (selected) => {
    // 把cartList中的每一项selected都设置为当前的全选框状态
    cartList.value.forEach(item => item.selected = selected)
  }

  // 购物车列表统计数据实现（已选择数量、商品合计价格）
  // 1.已选择数量(filter返回的是一个数组)
  const selectedCount = computed(() => cartList.value.filter(item => item.selected).reduce((a, c) => a + c.count, 0))
  // 2.已选择商品价钱合计
  const selectedPrice = computed(() => cartList.value.filter(item => item.selected).reduce((a, c) => a + c.count * c.price, 0))











  return { cartList, addCart, delCart, allCount, allPrice, singlecheck, isAll, allCheck, selectedCount, selectedPrice,clearCart }
},
  {
    persist: true,
  })
